import logging
import traceback
import unittest

import requests
from parameterized import parameterized

import app
import utils
from api.Recharge_api import RechargeApi
from api.open_account_api import OpenAccountApi
from api.reg_login_api import RegLoginApi
from api.tender_api import TenderApi


class TestTender(unittest.TestCase):

    @classmethod
    def setUpClass(cls) -> None:
        # 借款标测试数据初始化
        utils.init_tender_info()

    def setUp(self) -> None:
        # 创建session对象
        self.session=requests.session()
        # 调用投资模块类
        self.reg_tender_api=TenderApi(self.session)

        # 调用登录模块类
        self.reg_login_api=RegLoginApi(self.session)
        self.open_account_api = OpenAccountApi(self.session)
        self.recharge_api = RechargeApi(self.session)


    def tearDown(self) -> None:
        # 关闭session对象
        self.session.close()

    # 投资测试用例
    @parameterized.expand(utils.read_json("tender_data", "tender"))
    def test01_tender(self,phone,password,id,amount,exp_status_code, exp_status, exp_description):
        #获取登录接口
        self.reg_login_api.user_login(phone, password)
        #投资
        res= self.reg_tender_api.tender(id,amount)
        res_dict =res.json()
        logging.info("获取投资接口响应体数据:{}".format(res_dict))

        #断言
        utils.common_assert(self,res,exp_status_code, exp_status, exp_description)


    # 第三方投资测试用例
    def test02_third_tender(self):
        # 1.登录
        self.reg_login_api.user_login("13148939905", "123456")
        #获取投资
        res_tender=self.reg_tender_api.tender(642, 500)
        #获取第三方投资接口的url
        url= utils.html_util(res_tender)[0]
        #获取第三方接口的请求体数据
        data_dict=utils.html_util(res_tender)[1]
        #获取第三方接口返回的响应结果
        res4_tender = self.reg_tender_api.third_tender(url,data_dict)
        logging.info("第三方投资接口url:{}".format(url))
        logging.info("第三方投资返回的响应数据:{}".format(res4_tender.text))

        #断言
        self.assertIn("OK",res4_tender.text)

   # 投资业务流程
    def test03_tender_process(self):
        mobile='13148939959'
        password="123456"
        imgVerifyCode="8888"
        phone_code="666666"
        exp_status_code=200
        exp_status=200
        try:
            # 1.获取图片验证码接口
            res=self.reg_login_api.get_img_verify_code(0.123123)
            # 断言
            self.assertEqual(exp_status_code,res.status_code)

            # 2.获取短信验证码接口
            res = self.reg_login_api.get_phone_verify_code(mobile, password)
            # 断言
            utils.common_assert(self,res,exp_status_code,exp_status,"短信发送成功")

            # 3.调用注册接口，完成用户注册
            res = self.reg_login_api.user_register(mobile,password,imgVerifyCode,phone_code,"on")
            # 断言
            utils.common_assert(self, res, exp_status_code, exp_status, "注册成功")

            # 4.调用登录接口，完成登录成功
            res =self.reg_login_api.user_login(mobile,password)
            # 断言
            utils.common_assert(self, res, exp_status_code, exp_status, "登录成功")

            # 5.调用实名认证接口，完成实名认证
            res = self.open_account_api.realname("张三","150102199003074497")
            # 断言
            utils.common_assert(self, res, exp_status_code, exp_status,"提交成功")
            # 实名认证信息断言
            self.assertEqual("150****497", res.get("data").get("card_id"))
            self.assertIn("张", res.get("data").get("realname"))

            # 6.调用开户接口，完成登录账号开户
            res = self.open_account_api.open_account()
            # 断言
            utils.common_assert(self, res, 200, 200, "form")

            # 7.调用第三方开户接口，完成登录账号第三方开户
            # 7.1获取全部请求数据
            # 7.2获取请求url
            url = utils.html_util(res)[0]
            logging.info("第三方开户接口url:{}".format(url))
            # 7.3获取请求体数据
            data_dict = utils.html_util(res)[1]
            logging.info("第三方开户接口:{}".format(data_dict))
            # 7.4获取开户接口返回的响应结果
            res3_open_account = self.open_account_api.third_open_account(url, data_dict)
            logging.info("第三方开户返回的响应数据:{}".format(res3_open_account.text))
            # 断言
            self.assertIn("OK", res3_open_account.text)

            # 8.调用获取充值验证码接口，获取充值的验证码
            res = self.recharge_api.get_recharge_verify_code(0.123123)
            # 断言
            self.assertEqual(exp_status_code, res.status_code)

            # 9.调用充值接口，完成登录账号充值
            res = self.recharge_api.recharge("10000",imgVerifyCode)
            # 断言
            utils.common_assert(self, res, exp_status_code, exp_status, "form")

            # 10.调用第三方充值接口，完成登录账号第三方接口充值
            # 10.1获取url
            # 10.2获取请求体数据
            # 10.3完成第三方充值接口请求，获取响应结果
            url = utils.html_util(res)[0]
            # 获取第三方开户接口的请求体数据
            data_dict = utils.html_util(res)[1]
            # 获取第三方接口返回的响应结果
            res3_recharge = self.recharge_api.third_recharge(url, data_dict)
            logging.info("第三方充值接口url:{}".format(url))
            logging.info("第三方充值返回的响应数据:{}".format(res3_recharge.text))
            # 断言
            self.assertIn("OK", res3_recharge.text)
            # 断言

            # 11.调用投资接口，完成登录账号的投资
            res = self.reg_tender_api.tender("642","500")
            # 断言
            utils.common_assert(self, res, exp_status_code, exp_status,"form")

            # 12.调用第三方投资接口，完成登录账号的第三方投资
            # 获取第三方投资接口请求数据
            # 获取第三方投资接口url
            url = utils.html_util( res)[0]
            # 获取第三方投资接口字典类定的请求体数据
            data_dict = utils.html_util( res)[1]
            # 获取第三方投资接口返回的响应结果
            # 获取第三方接口的请求体数据
            logging.info("第三方投资接口url:{}".format(url))
            logging.info("第三方投资返回的响应数据:{}".format( res.text))
            # 获取第三方接口返回的响应结果
            res4_tender = self.reg_tender_api.third_tender(url, data_dict)
            # 断言
            self.assertIn("OK", res4_tender.text)

        except:
            traceback.print_exc()



